home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / ping.py < prev    next >
Text File  |  2006-06-30  |  3KB  |  90 lines

  1. #!/usr/bin/python
  2. # Copyright (c) 2003 CORE Security Technologies
  3. #
  4. # This software is provided under under a slightly modified version
  5. # of the Apache Software License. See the accompanying LICENSE file
  6. # for more information.
  7. #
  8. # $Id: ping.py,v 1.3 2003/10/27 17:36:56 jkohen Exp $
  9. #
  10. # Simple ICMP ping.
  11. #
  12. # This implementation of ping uses the ICMP echo and echo-reply packets
  13. # to check the status of a host. If the remote host is up, it should reply
  14. # to the echo probe with an echo-reply packet.
  15. # Note that this isn't a definite test, as in the case the remote host is up
  16. # but refuses to reply the probes.
  17. # Also note that the user must have special access to be able to open a raw
  18. # socket, which this program requires.
  19. #
  20. # Authors:
  21. #  Gerardo Richarte <gera@coresecurity.com>
  22. #  Javier Kohen <jkohen@coresecurity.com>
  23. #
  24. # Reference for:
  25. #  ImpactPacket: IP, ICMP, DATA.
  26. #  ImpactDecoder.
  27.  
  28. import select
  29. import socket
  30. import time
  31. import sys
  32.  
  33. from impacket import ImpactDecoder, ImpactPacket
  34.  
  35. if len(sys.argv) < 3:
  36.     print "Use: %s <src ip> <dst ip>" % sys.argv[0]
  37.     sys.exit(1)
  38.  
  39. src = sys.argv[1]
  40. dst = sys.argv[2]
  41.  
  42. # Create a new IP packet and set its source and destination addresses.
  43.  
  44. ip = ImpactPacket.IP()
  45. ip.set_ip_src(src)
  46. ip.set_ip_dst(dst)
  47.  
  48. # Create a new ICMP packet of type ECHO.
  49.  
  50. icmp = ImpactPacket.ICMP()
  51. icmp.set_icmp_type(icmp.ICMP_ECHO)
  52.  
  53. # Include a 156-character long payload inside the ICMP packet.
  54. icmp.contains(ImpactPacket.Data("A"*156))
  55.  
  56. # Have the IP packet contain the ICMP packet (along with its payload).
  57. ip.contains(icmp)
  58.  
  59. # Open a raw socket. Special permissions are usually required.
  60. s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
  61. s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
  62.  
  63. seq_id = 0
  64. while 1:
  65.     # Give the ICMP packet the next ID in the sequence.
  66.     seq_id += 1
  67.     icmp.set_icmp_id(seq_id)
  68.  
  69.     # Calculate its checksum.
  70.     icmp.set_icmp_cksum(0)
  71.     icmp.auto_checksum = 1
  72.  
  73.     # Send it to the target host.
  74.     s.sendto(ip.get_packet(), (dst, 0))
  75.  
  76.     # Wait for incoming replies.
  77.     if s in select.select([s],[],[],1)[0]:
  78.        reply = s.recvfrom(2000)[0]
  79.  
  80.        # Use ImpactDecoder to reconstruct the packet hierarchy.
  81.        rip = ImpactDecoder.IPDecoder().decode(reply)
  82.        # Extract the ICMP packet from its container (the IP packet).
  83.        ricmp = rip.child()
  84.  
  85.        # If the packet matches, report it to the user.
  86.        if rip.get_ip_dst() == src and rip.get_ip_src() == dst and icmp.ICMP_ECHOREPLY == ricmp.get_icmp_type():
  87.            print "Ping reply for sequence #%d" % ricmp.get_icmp_id()
  88.  
  89.        time.sleep(1)
  90.